package com.swyc.osschat.Test.designMode.template.run;

import com.swyc.osschat.Test.designMode.template.impl.Bicycle;
import com.swyc.osschat.Test.designMode.template.impl.Bus;
import com.swyc.osschat.Test.designMode.template.impl.Taxi;
import com.swyc.osschat.Test.designMode.template.impl.Travel;

/**
 * @description Java 策略模式
 * 一、定义
 *  该模式定义了一系列算法，并将每个算法封装起来，使它们可以相互替换，且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式，它通过对算法进行封装，把使用算法的责任和算法的实现分割开来，并委派给不同的对象对这些算法进行管理。
 *  主要角色：
 *      抽象策略：这是一个抽象角色，通常由接口或抽象类来实现，此角色给出所有的具体策略类所需的接口。
 *      具体策略：实现抽象策略，并提供具体的实现。
 *      环境：持有一个策略类的引用，提供给客户端调用。
 * 二、代码实现
 *  举例：比如我们出去旅游，有很多种交通方式，自行车，公交车，出租车，选择其中一种都可以到达目的地，接下来使用策略模式来实现；
 * 三、总结
 *  优点：策略类可以自由切换，易于扩展，添加新的策略无需改变原有代码，符合开闭原则，避免了使用多重条件选择语句 if...else switch。
 *  缺点：使用者必须知道所有的策略类，策略模式同样也会产生很多策略类，
 *  使用场景：
 *      一个系统需要动态地在几种算法中选择一种时，可将每个算法封装到策略类中。
 *      一个类定义了多种行为，并且这些行为在这个类的操作中以多个条件语句的形式出现，可将每个条件分支移入它们各自的策略类中以代替这些条件语句。
 *      系统中各算法彼此完全独立，且要求对客户隐藏具体算法的实现细节时。
 *      系统要求使用算法的客户不应该知道其操作的数据时，可使用策略模式来隐藏与算法相关的数据结构。
 *      多个类只区别在表现行为不同，可以使用策略模式，在运行时动态选择具体要执行的行为。
 * @Author: z156940l@outlook.com
 * @className Test
 * @Date: 2022/7/25 22:47
 */
public class Test {

    public static void main(String[] args) {
        Travel travel = new Travel();
        travel.setVehicle(new Bicycle());
        travel.goTravel();

        travel.setVehicle(new Bus());
        travel.goTravel();

        travel.setVehicle(new Taxi());
        travel.goTravel();
    }
}
